package com.flying.oop.classmember.inner;


import java.sql.SQLOutput;

/**
 * @ClassName:
 * @author: flying
 * @date 2024 2024/12/11 10:51
 * @Description: 成员内部类（非静态内部类）
 *  成员内部类的特点：
 *    1. 定义在类里方法外，和成员变量的位置一致
 *    2. 也会被编译成字节码文件，名字是 外部类名$内部类名.class
 *    3. 外部类只能使用 public / 缺省
 *    4. 还可以被 final 以及 abstract 修饰符来修饰（无法被外部类继承）
 *    5. 怎么创建内部类对象？ 前提是有一个外部类对象
 *      5.1 在外部类里创建好内部类对象，然后通过get方法返回创建好的内部类对象
 *      5.2 在无关类里直接创建内部类对象
 *    6. 在成员内部类里，可以访问外部类的策划给你呀UN变量，包括 private 和 static
 *    7. 如果成员内部类的成员变量和外部类的成员变量同名，默认访问的是内部类的成员变量
 *       如果想要访问外部类的成员变量，需要使用 外部类名.this.成员变量名 来访问！！！
 *    8. 成员内部类里不能定义静态成员变量 ,但是可以使用 static final 定义静态常量
 *
 */
public class MemberOuter {


    private final int x = 9;
    public static int y = 15;
    private int m = 888;


    public class MemberInner {
        private static final int n =10;
        private int m=666;
        // ???  成员内部类种不能定义静态变量
        // JDK16以前不可以，JDK16及以后版本可以定义静态的属性了。java规范的改变，不需要深究
        static  String str = new String("哥哥给");

        public void test(){

//            name="hello";
//            System.out.println(name);
//            System.out.println(MemberInner.name);
            // 成员内部类可以直接访问外部类的成员
            System.out.println(x);  // 外部类的成员常量
            System.out.println(y);  // 外部类的静态静态变量
            System.out.println(n);  // 内部类的静态常量
            System.out.println("在成员内部类里直接打印m"+m);
            System.out.println("在成员内部类直接打印this.m"+this.m);
            System.out.println("在成员内部类访问外部类同名的变量吗"+MemberOuter.this.m);


        }


    }


    // 供外部获取成员内部类变量
    public MemberInner getInner(){
        // 外部类不可以直接访问内部类的成员,需要通过内部类访问
        System.out.println(MemberInner.n);
        return new MemberInner();
    }


    abstract class A {}

    // 成员内部类可以在内部被继承
    class B extends MemberInner{}


}

// 外部类无法继承内部类
//class C extends MemberOuter.MemberInner{}